﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace GeneratorLeksickogAnalizatora
{
    class UlaznaDatoteka : IUlaznaDatoteka
    {
        List<string> lajne = new List<string>();
        Dictionary<string,string> rIzrazi = new Dictionary<string,string>();
        int brojReda = 0;

        /// <summary>
        /// Konstruktor klase - raspetljava regularne definicije i priprema fajl. Fajl ostaje nepromijenjen.
        /// </summary>
        /// <param name="imeUlazneDatoteke">putanja do ulazne datoteke s definicijom lex analizatora</param>
        public UlaznaDatoteka(string imeUlazneDatoteke)
        {
            TextReader ulazniFajl = null;
            string redak,regDef,val;
            int offset,l,d;
            bool rIzraziGotovo = false;
            try
            {
                ulazniFajl = new StreamReader(imeUlazneDatoteke);
                while((redak = ulazniFajl.ReadLine())!=null){
                    if (redak.StartsWith("%"))
                    {
                        rIzraziGotovo = true;
                    }
                    offset=redak.IndexOf("{");
                    while(offset>=0 && (d = redak.IndexOf("}",offset))>=0)
                    {
                        l = redak.IndexOf("{", offset);
                        
                        regDef=redak.Substring(l,d-l+1);
                        if (regDef == null)
                        {
                            break;
                        }                    
                        if (rIzrazi.TryGetValue(regDef,out val))
                        {
                            redak = redak.Replace(regDef,"("+val+")");
                        }
                        offset = redak.IndexOf("{",offset+1);   
                    }
                    if (!rIzraziGotovo)
                    {
                        rIzrazi.Add(redak.Split(' ')[0], redak.Split(' ')[1]);
                    }
                    lajne.Add(redak);
                }
                            
            }
            catch (Exception e)
            {
                Console.WriteLine("Ulazna datoteka: {0}\n", e.ToString());
            }
            finally
            {
                if (ulazniFajl == null)
                {
                    ulazniFajl.Close();
                }
            }
        }
        
        /// <summary>
        /// Dohvaća sljedeći red iz ulazne datoteke
        /// </summary>
        /// <returns>sljedeći red ili null ako smo došli do kraja datoteke</returns>
        public string DohvatiRed()
        {
            if (brojReda >= lajne.Count()){
                return null;
            }
            
            return lajne[brojReda++];
        }
        
        /// <summary>
        /// Resetira datoteku; čitanje kreće ispočetka
        /// </summary>
        /// <returns>void</returns>
        public void Reset()
        {
            brojReda=0;
        }

       }
}
            
 